package com.lili.common.crud;

import com.lili.store.service.impl.Prefix;
import com.lili.store.utils.DateUtils;

/**
 * 带有编码实现的基类
 *
 * @param <T> javabean
 * @param <M> Mapper接口
 */
public class BaseCodeServiceImpl<T, M extends ICodeMapper> extends BaseServiceImpl<T, M> {
    protected String currentMaxCode;//当前最大编码

    /**
     * 生成新的编码
     * @param prefix 前缀枚举类型
     * @return
     */
    protected String getNextCode(Prefix prefix) {
        //获取系统年月
        String now = DateUtils.getYm();
        if (null != currentMaxCode) {
            //有值  在这个基础上计算新的编码 CG2023070004
            String tmp = currentMaxCode.substring(2, 8);
            //用系统时间与已有编码时间比较
            if (tmp.equals(now)) {
                //在原有编码基础上加1
                currentMaxCode = getNewCode(currentMaxCode);
            } else {
                //不是同一月份  返回当前月份第一个编码
                currentMaxCode = prefix + now + "0001";
            }

            return currentMaxCode;
        }

        //内存在编码不存在  查询数据库
        currentMaxCode = baseMapper.queryMaxCode();
        //判断当前年月  是否存大最大编码
        if (null == currentMaxCode) {
            //直接返回当前年月  第一个编码  CGYM0001
            currentMaxCode = prefix + now + "0001";
            return currentMaxCode;
        }

        //执行到这里 说明数据库存在最大编码  currentMaxCode  计算新的编码
        currentMaxCode = getNewCode(currentMaxCode);
        return currentMaxCode;
    }

    /**
     * 根据给定的编码  生成下一个编码
     *
     * @param code
     * @return
     */
    String getNewCode(String code) {
        //假如 CG2023070003
        String prefix = code.substring(0, 8);//前缀
        String suffix = code.substring(8);
        int tmp = Integer.parseInt(suffix);
        tmp++;
        return prefix + String.format("%04d", tmp);
    }
}
